// 定义
websocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议。
弥补了http协议的缺陷，通信只能由客户端发起，服务器无法主动向客户端发送消息。

// 实现方式
// 1. 创建WebSocket对象
var ws = new WebSocket("ws://localhost:8080");
// 链接发生错误的回调
ws.onerror = function(event) {
  
}
// 链接成功建立的回调
ws.onopen = function(event) {
  
}
// 接收到消息的回调
ws.onmessage = function(event) {
  
}
// 连接关闭的回调
ws.onclose = function(event) {
  
}
// 主动发送数据
ws.send("hello world");
// 主动关闭连接
ws.close();



// 进阶知识
WebSocket的连接建立过程是怎样的？
WebSocket的连接建立过程如下：

1. 客户端发送一个HTTP请求到服务器，请求中包含一个Upgrade头，表示客户端希望升级到WebSocket协议。
2. 服务器接收到请求后，如果同意升级，会返回一个HTTP响应，响应中包含一个101 Switching Protocols状态码，表示同意升级到WebSocket协议。
3. 客户端和服务器之间建立了一个TCP连接，并使用WebSocket协议进行通信。

WebSocket的连接建立过程是异步的，客户端和服务器之间会进行多次握手，以确保连接的建立是安全的。


WebSocket协议的基本结构是什么？

握手阶段：通过HTTP协议的Upgrade机制建立连接。
数据传输阶段：在建立的TCP连接上进行数据帧传输，包括文本帧、二进制帧、控制帧等。
WebSocket握手过程中的HTTP请求和响应是什么样的？
当客户端想要与服务器建立WebSocket连接时，首先会发送一个特殊的HTTP请求。这个请求的目标是将现有的HTTP连接升级为WebSocket连接。
如果服务器同意升级连接，它会返回一个101状态码的HTTP响应，表示协议切换成功。

WebSocket的控制帧有哪些？

关闭帧（Close frame）：用于关闭连接。
Ping帧：用于检查连接是否仍然活跃。
Pong帧：用于响应Ping帧。


WebSocket如何处理心跳机制和连接保活？

Ping/Pong机制：客户端或服务器定期发送Ping帧，对方响应Pong帧，确保连接保持活跃。
应用层心跳：在应用协议中实现定期发送心跳消息，检测连接状态。

WebSocket 的其他特点包括：
（1）建立在 TCP 协议之上，服务器端的实现比较容易。
（2）与 HTTP 协议有着良好的兼容性。默认端口也是80和443，并且握手阶段采用 HTTP 协议，因此握手时不容易屏蔽，能通过各种 HTTP 代理服务器。
（3）数据格式比较轻量，性能开销小，通信高效。
（4）可以发送文本，也可以发送二进制数据。
（5）没有同源限制，客户端可以与任意服务器通信。
（6）协议标识符是ws（如果加密，则为wss），服务器网址就是 URL。


关键内容
Upgrade: websocket
Connection: Upgrade


WebSocket心跳包是WebSocket协议的保活机制，用于维持长连接。有效的心跳包可以防止长时间不通讯时，WebSocket自动断开连接。
心跳包是指在一定时间间隔内，WebSocket发送的空数据包。常见的WebSocket心跳包机制如下：


客户端定时向服务器发送心跳数据包，以保持长连接。
服务器定时向客户端发送心跳数据包，以检测客户端连接是否正常。
双向发送心跳数据包。


三、WebSocket心跳机制原理
WebSocket心跳机制的原理是利用心跳包及时发送和接收数据，保证WebSocket长连接不被断开。WebSocket心跳机制的原理可以用下面的流程来说明：


客户端建立WebSocket连接。
客户端向服务器发送心跳数据包，服务器接收并返回一个表示接收到心跳数据包的响应。
当服务器没有及时接收到客户端发送的心跳数据包时，服务器会发送一个关闭连接的请求。
服务器定时向客户端发送心跳数据包，客户端接收并返回一个表示接收到心跳数据包的响应。
当客户端没有及时接收到服务器发送的心跳数据包时，客户端会重新连接WebSocket


四、WebSocket心跳机制必要吗
WebSocket心跳机制是必要的，它可以使 WebSocket 连接保持长连接，避免断开连接的情况发生。同时，心跳机制也可以检查WebSocket连接的状态，及时处理异常情况。
